home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 April / Software of the Month Club 1996 April.iso / pc / os2 / psutils / src / psbook.c < prev    next >
C/C++ Source or Header  |  1996-02-21  |  3KB  |  112 lines

  1. /* psbook.c
  2.  * Copyright (C) Angus J. C. Duggan 1991-1995
  3.  * See file LICENSE for details.
  4.  *
  5.  * rearrange pages in conforming PS file for printing in signatures
  6.  *
  7.  * Usage:
  8.  *       psbook [-q] [-s<signature>] [infile [outfile]]
  9.  */
  10.  
  11. #include "psutil.h"
  12. #include "pserror.h"
  13. #include "patchlev.h"
  14.  
  15. char *program ;
  16. int pages ;
  17. int verbose ;
  18. FILE *infile ;
  19. FILE *outfile ;
  20. char pagelabel[BUFSIZ] ;
  21. int pageno ;
  22.  
  23. static void usage(void)
  24. {
  25.    fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
  26.    fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
  27.    fprintf(stderr, "Usage: %s [-q] [-s<signature>] [infile [outfile]]\n",
  28.        program);
  29.    fprintf(stderr, "       <signature> must be positive and divisible by 4\n");
  30.    fflush(stderr);
  31.    exit(1);
  32. }
  33.  
  34.  
  35. void main(int argc, char *argv[])
  36. {
  37.    int signature = 0;
  38.    int currentpg, maxpage;
  39.  
  40.    infile = stdin;
  41.    outfile = stdout;
  42.    verbose = 1;
  43.    for (program = *argv++; --argc; argv++) {
  44.       if (argv[0][0] == '-') {
  45.      switch (argv[0][1]) {
  46.      case 's':    /* signature size */
  47.         signature = atoi(*argv+2);
  48.         if (signature < 1 || signature % 4) usage();
  49.         break;
  50.      case 'q':    /* quiet */
  51.         verbose = 0;
  52.         break;
  53.      case 'v':    /* version */
  54.      default:
  55.         usage();
  56.      }
  57.       } else if (infile == stdin) {
  58.      if ((infile = fopen(*argv, OPEN_READ)) == NULL)
  59.         message(FATAL, "can't open input file %s\n", *argv);
  60.       } else if (outfile == stdout) {
  61.      if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
  62.         message(FATAL, "can't open output file %s\n", *argv);
  63.       } else usage();
  64.    }
  65. #if defined(MSDOS) || defined(WINNT)
  66.    if ( infile == stdin ) {
  67.       int fd = fileno(stdin) ;
  68.       if ( setmode(fd, O_BINARY) < 0 )
  69.          message(FATAL, "can't open input file %s\n", argv[4]);
  70.     }
  71.    if ( outfile == stdout ) {
  72.       int fd = fileno(stdout) ;
  73.       if ( setmode(fd, O_BINARY) < 0 )
  74.          message(FATAL, "can't reset stdout to binary mode\n");
  75.     }
  76. #endif
  77.    if ((infile=seekable(infile))==NULL)
  78.       message(FATAL, "can't seek input\n");
  79.  
  80.    scanpages();
  81.  
  82.    if (!signature)
  83.       signature = maxpage = pages+(4-pages%4)%4;
  84.    else
  85.       maxpage = pages+(signature-pages%signature)%signature;
  86.  
  87.    /* rearrange pages */
  88.    writeheader(maxpage);
  89.    writeprolog();
  90.    writesetup();
  91.    for (currentpg = 0; currentpg < maxpage; currentpg++) {
  92.       int actualpg = currentpg - currentpg%signature;
  93.       switch(currentpg%4) {
  94.       case 0:
  95.       case 3:
  96.      actualpg += signature-1-(currentpg%signature)/2;
  97.      break;
  98.       case 1:
  99.       case 2:
  100.      actualpg += (currentpg%signature)/2;
  101.      break;
  102.       }
  103.       if (actualpg < pages)
  104.      writepage(actualpg);
  105.       else
  106.      writeemptypage();
  107.    }
  108.    writetrailer();
  109.  
  110.    exit(0);
  111. }
  112.